package com.lzh.file.service;

import com.lzh.file.entity.FileInfo;
import com.lzh.runke.core.entity.spec.BaseSpec;
import com.lzh.runke.core.service.IBaseService;
import com.lzh.runke.core.web_base.Result;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.Collection;
import java.util.Date;
import java.util.List;

/**
 * 通用码表 Service
 * @author xie
 */
public interface IFileService extends IBaseService<FileInfo, BaseSpec> {

    /**
     * 上传文件
     *
     * @param file
     * @return
     */
    Result<FileInfo> upload(File file);

    /**
     * 上传文件
     *
     * @param file
     * @return
     */
    Result<FileInfo> upload(MultipartFile file);

    /**
     * 上传文件(多个)
     * @param files []
     * @return fileInfos List
     */
    Result<List<FileInfo>> upload(MultipartFile[] files);

    /**
     * 上传文件(多个)
     * @param files Collection
     * @return fileInfos List
     */
    Result<List<FileInfo>> upload(Collection<MultipartFile> files);

    /**
     * 根据文件名获取文件信息
     *
     * @param filename
     * @return
     */
    FileInfo findByFilename(String filename);

    /**
     * 根据文件名获取文件信息
     * @param fileInfos
     * @return
     */
    FileInfo[] loadDetailsByFilenames(FileInfo[] fileInfos);

    /**
     * 根据文件名更新是否已与业务表关联
     *
     * @param filename
     * @return
     */
    void relateByFilename(String filename);

    /**
     * 根据文件名更新是否已与业务表关联
     *
     * @param fileInfos
     * @return
     */
    void relateByFilenames(FileInfo[] fileInfos);

    /**
     * 根据文件名更新是否已与业务表关联
     *
     * @param filenames
     * @return
     */
    void relateByFilenames(List<String> filenames);

    /**
     * 删除已上传文件
     *
     * @param filename
     * @return
     */
    Result<Void> deleteUploaded(String filename);

    /**
     * 删除已上传文件
     *
     * @param filenames
     * @return
     */
    Result<Void> deleteUploaded(List<String> filenames);

    /**
     * 文件预览
     *
     * @param filename
     * @return
     */
    Result<byte[]> preview(String filename);

    /**
     * 文件下载
     *
     * @param filename
     * @return
     */
    byte[] download(String filename);

    /**
     * 获取指定时间范围内未关联业务表的文件信息
     * @param fromDate
     * @param toDate
     * @return
     */
    List<FileInfo> loadUnRelatedFilenames(Date fromDate, Date toDate);

    /**
     * 根据文件名更新是否已与业务表关联
     *
     * @param filename
     * @return
     */
    void unRelateByFilename(String filename);

    /**
     * 根据文件名更新是否已与业务表关联
     *
     * @param fileInfos
     * @return
     */
    void unRelateByFilenames(FileInfo[] fileInfos);

    /**
     * 根据文件名更新是否已与业务表关联
     *
     * @param filenames
     * @return
     */
    void unRelateByFilenames(List<String> filenames);

    /**
     * 加载文件
     * @param filename
     * @return
     */
    File loadFile(String filename);
}